home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Joystick Magazine 1996 March
/
cd joystick 69 No11.iso
/
mac
/
Utilitaires
/
HexEdit 1.0.7
/
HexEditSource
/
Source
/
Main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-09-25
|
10KB
|
419 lines
/************************************************************************************
* Main.c
*
* from HexEdit, a simple hex editor
* copyright 1993, Jim Bumgardner
*
* Revision History is in History.note
************************************************************************************/
#include "HexEdit.h"
#include "AppleEvents.h"
#include <Traps.h>
void MyInitMacintosh(void);
void MyInitMultifinder(void);
void InitAppleEvents(void);
void CheckEnvironment(void);
void MyHandleEvent(void);
void MyDoEvent(EventRecord *theEvent);
void IdleObjects(EventRecord *er);
Boolean gWNEImplemented,gQuitFlag,gSys7Flag,gColorQDFlag;
// Typical Macintosh Initialization Code
// Main Entry Point
main()
{
// Standard Mac Initialization
MyInitMacintosh();
// Check if Multifinder (WaitNextEvent) is implemented
MyInitMultifinder();
// Check if System 7
CheckEnvironment();
// Init Apple Events
InitAppleEvents();
// Set up the menu bar
MySetUpMenus();
InitializeEditor();
if (!gSys7Flag)
AskEditWindow();
// main event loop
while (!gQuitFlag) // Till the End of Time...
MyHandleEvent(); // Get an Event, do something about it
CleanupEditor();
}
// Standard Macintosh Initialization
void MyInitMacintosh(void)
{
MaxApplZone();
InitGraf(&thePort);
InitFonts();
FlushEvents(everyEvent, 0);
InitWindows();
InitMenus();
TEInit();
InitDialogs(0L);
InitCursor();
}
// Check if WaitNextEvent (Multifinder) is implemented on this Macintosh
void MyInitMultifinder(void)
{
gWNEImplemented = (NGetTrapAddress(_WaitNextEvent, ToolTrap) !=
NGetTrapAddress(_Unimplemented,ToolTrap));
}
// The Main Event Dispatcher - this routine should be called repeatedly
void MyHandleEvent(void)
{
EventRecord theEvent;
Boolean ok;
// If the more modern WaitNextEvent is implemented, use it
if (gWNEImplemented)
// We don't have to call SystemTask because WaitNextEvent calls it for us
// Get the next event
ok = WaitNextEvent(everyEvent,&theEvent,0L,NULL);
else {
// we are running in (Single) Finder under system 6 or less
// Give Desk Accessories some processing time
SystemTask ();
// Get the next event
ok = GetNextEvent (everyEvent, &theEvent);
}
if (IsDialogEvent(&theEvent)) {
DoModelessDialogEvent(&theEvent);
}
else if (ok) {
// Handle the Event
MyDoEvent(&theEvent);
}
else {
// Nothing happened, kick back...
IdleObjects(&theEvent);
}
}
void MyDoEvent(EventRecord *theEvent)
{
short windowCode;
WindowPtr theWindow;
switch (theEvent->what) {
//
// Was the mouse button pressed?
case mouseDown:
// Find out where the mouse went down
windowCode = FindWindow (theEvent->where, &theWindow);
switch (windowCode) {
case inSysWindow: // Desk Accessory?
SystemClick (theEvent, theWindow);
break;
case inMenuBar: // Menu Bar?
MyAdjustMenus();
MyHandleMenu(MenuSelect(theEvent->where));
break;
default: // Cursor was inside our window
// If the window isn't in the front
if (theWindow != FrontWindow()) {
// Make it so...
SelectWindow(theWindow);
MyAdjustMenus();
}
else {
// Window is already in the front, handle the click
switch (windowCode) {
case inContent: // Content area?
if (((WindowPeek) theWindow)->refCon == MyWindowID)
((ObjectWindowPtr) theWindow)->HandleClick(theWindow, theEvent->where, theEvent);
break;
case inDrag: // Dragbar?
{
Rect dragRect;
dragRect = screenBits.bounds;
// Handle the dragging of the window
DragWindow(theWindow, theEvent->where, &dragRect);
if (!((ObjectWindowPtr) theWindow)->floating)
SelectWindow(theWindow);
}
break;
case inGoAway: // close box?
if (TrackGoAway(theWindow, theEvent->where)) {
// If mouse is released inside the close box
// Hide or close the window
if (((WindowPeek) theWindow)->refCon == MyWindowID)
CloseEditWindow(theWindow);
else if (theWindow == gSearchWin) {
DisposDialog(gSearchWin);
gSearchWin = NULL;
}
MyAdjustMenus();
}
break;
case inGrow: // Grow box?
{
long growResult;
Rect growRect;
SelectWindow(theWindow);
SetRect(&growRect,MaxWindowWidth+SBarSize-1,64,
MaxWindowWidth+SBarSize-1,gMaxHeight);
// Handle the mouse tracking for the resizing
growResult = GrowWindow(theWindow,theEvent->where,&growRect);
// Change the size of the window
SizeWindow(theWindow,LoWord(growResult),HiWord(growResult),true);
AdjustScrollBars(theWindow, true);
DrawPage((EditWindowPtr) theWindow);
// Redraw the window
SetPort(theWindow);
InvalRect(&theWindow->portRect);
}
break;
case inZoomIn:
case inZoomOut:
if (TrackBox(theWindow, theEvent->where, windowCode)) {
SetPort(theWindow);
EraseRect(&theWindow->portRect);
ZoomWindow(theWindow, windowCode, true);
AdjustScrollBars(theWindow, true);
DrawPage((EditWindowPtr) theWindow);
// Redraw the window
SetPort(theWindow);
InvalRect(&theWindow->portRect);
}
}
}
break;
}
break;
// Was a key pressed?
case keyDown:
case autoKey:
// Was the cmd-key being held down? If so, process menu bar short cuts.
if ((theEvent->modifiers & cmdKey) != 0) {
MyAdjustMenus();
MyHandleMenu(MenuKey((char) (theEvent->message & charCodeMask)));
}
else {
theWindow = FrontWindow();
if (((WindowPeek) theWindow)->refCon == MyWindowID &&
((ObjectWindowPtr) theWindow)->ProcessKey != NULL)
((ObjectWindowPtr) theWindow)->ProcessKey(theWindow, theEvent);
}
break;
// Does a window need to be redrawn?
case updateEvt:
theWindow = (WindowPtr) theEvent->message;
if (((WindowPeek) theWindow)->refCon == MyWindowID)
((ObjectWindowPtr) theWindow)->Update(theWindow);
break;
// Has a window been activated or deactivated?
case activateEvt:
theWindow = (WindowPtr) theEvent->message;
// Force it to be redrawn
if (((WindowPeek) theWindow)->refCon == MyWindowID)
((ObjectWindowPtr) theWindow)->Activate(theWindow,(theEvent->modifiers & activeFlag) > 0);
break;
case osEvt:
// Force it to be redrawn
switch (theEvent->message >> 24) {
case suspendResumeMessage:
theWindow = FrontWindow();
if (theWindow && ((WindowPeek) theWindow)->refCon == MyWindowID)
((ObjectWindowPtr) theWindow)->Activate(theWindow,(theEvent->message & resumeFlag) > 0);
break;
}
break;
case kHighLevelEvent:
if (gSys7Flag)
AEProcessAppleEvent(theEvent);
break;
}
}
// Do Idle Time Processing
void IdleObjects(EventRecord *er)
{
WindowPeek theWin;
theWin = (WindowPeek) FrontWindow();
while (theWin) {
if (theWin->refCon == MyWindowID &&
((ObjectWindowPtr) theWin)->Idle)
((ObjectWindowPtr) theWin)->Idle((WindowPtr) theWin, er);
theWin = theWin->nextWindow;
}
}
Boolean GotRequiredParams(AppleEvent *theEvent)
{
DescType returnedType;
Size actualSize;
OSErr err;
err = AEGetAttributePtr ( theEvent, keyMissedKeywordAttr,
typeWildCard, &returnedType, NULL, 0,
&actualSize);
return err == errAEDescNotFound;
} /* CAppleEvent::GotRequiredParams */
void DoOpenEvent(AppleEvent *theEvent)
{
Handle docList = NULL;
long i, numDocs;
FSSpec myFSS;
DescType eventID;
AEDescList theList;
AEKeyword aeKeyword=keyDirectObject;
long itemCount;
DescType actualType;
Size actualSize;
OSErr oe;
if ((oe = AEGetParamDesc( theEvent, keyDirectObject, typeAEList, &theList)) != noErr) {
DebugStr("\pAEGetParamDesc");
return;
}
if (!GotRequiredParams(theEvent)) {
DebugStr("\pGotRequiredParams");
return;
}
if ((oe = AECountItems( &theList, &itemCount)) != noErr) {
DebugStr("\pAECountItems");
return;
}
for (i = 1; i <= itemCount; i++)
{
oe = AEGetNthPtr( &theList, i, typeFSS, &aeKeyword, &actualType,
(Ptr) &myFSS, sizeof( FSSpec), &actualSize);
if (oe == noErr) {
OpenEditWindow(&myFSS);
}
}
AEDisposeDesc(&theList);
// event was handled successfully
}
pascal OSErr AppleEventHandler(AppleEvent *theEvent,AppleEvent *reply, long refCon)
{
OSErr err;
DescType actualType;
Size actualSize;
DescType eventClass, eventID;
OSErr oe;
if ((oe = AEGetAttributePtr( (AppleEvent*) theEvent, keyEventClassAttr,
typeType, &actualType, (Ptr) &eventClass,
sizeof(eventClass), &actualSize)) != noErr)
return oe;
if ((oe = AEGetAttributePtr( (AppleEvent*) theEvent, keyEventIDAttr,
typeType, &actualType, (Ptr) &eventID,
sizeof(eventID), &actualSize)) != noErr)
return oe;
if (eventClass == kCoreEventClass)
{
switch (eventID)
{
case kAEOpenApplication:
if (GotRequiredParams(theEvent))
{
// gGopher->DoCommand( cmdNew);
// anAppleEvent->SetErrorResult( noErr);
AskEditWindow();
}
break;
case kAEOpenDocuments:
DoOpenEvent( theEvent);
break;
case kAEPrintDocuments:
break;
case kAEQuitApplication:
if (GotRequiredParams(theEvent))
{
gQuitFlag = true;
}
break;
}
}
return noErr;
}
void InitAppleEvents(void)
{
if (gSys7Flag)
AEInstallEventHandler(typeWildCard, typeWildCard,
(EventHandlerProcPtr) AppleEventHandler,
0,FALSE);
}
void CheckEnvironment(void)
{
SysEnvRec sEnv;
OSErr oe;
oe = SysEnvirons(1,&sEnv);
gSys7Flag = sEnv.systemVersion >= 0x0700;
gColorQDFlag = sEnv.hasColorQD;
}
/* end Evtlab.c */